package com.itbaizhan.rabbitmq2;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//rabbitmq配置类，创建队列和交换机
@Configuration
public class RabbitmqConfig {

   private final String EXCHANGE_NAME="boot_topic_exchange";
   private final String QUEUE_NAME="boot_queue";
    //创建交换机  注意导入Exchange的包，
    @Bean("bootExchange")  //spring容器中有很多交换机，加上id方便找到
    public Exchange getExchange(){
        return ExchangeBuilder
                .topicExchange(EXCHANGE_NAME)  //交换机类型
                .durable(true)  //是否持久化
                .build();
    }
    //创建队列
    @Bean("bootQueue")
    public Queue getQueue(){
        return new Queue(QUEUE_NAME);
    }
    //交换机绑定队列  @Qualifier是从spring容器中拿对象
    @Bean
    public Binding bindMessageQueue(@Qualifier("bootExchange")Exchange exchange,@Qualifier("bootQueue")Queue queue){
        return BindingBuilder
                .bind(queue)
                .to(exchange)
                //路由关键字，找到含有message的路由
                .with("#.message.#")
                .noargs();
    }

}
/*在测试类测试发关消息
* pringBoot整合RabbitMQ时，提供了工具类RabbitTemplate发送消息，
编写生产者时只需要注入RabbitTemplate即可发送消息。
调用 rabbitTemplate.convertAndSend方法*/
/*我们编写另一个SpringBoot项目作为RabbitMQ的消费者,编写消费者，监听队列
*
*
* 创建SpringBoot项目，引入RabbitMQ起步依赖

<!-- rabbitmq起步依赖 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

编写配置文件

spring:
  rabbitmq:
   host: 192.168.0.162
   port: 5672
   username: itbaizhan
   password: itbaizhan
   virtual-host: /

#日志格式
logging:
  pattern:
   console: '%d{HH:mm:ss.SSS} %clr(%-5level) ---  [%-15thread] %cyan(%-50logger{50}):%msg%n'

*
* 编写消费者，监听队列

@Component
public class Consumer {
  // 监听队列
  @RabbitListener(queues = "boot_queue")
  public void listen_message(String message){
    System.out.println("发送短信："+message);
   }
}
*
* 启动项目，可以看到消费者会消费队列中的消息
* （Rabbitmq3Application.java）*/